unit TransferenciaDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, FileUtil, LResources, Forms, Controls, Graphics,
  Dialogs, ZDataset, ZSqlUpdate, ZSequence, MainDM, QueryConditions;

type

  { TTransferenciaData }

  TTransferenciaData = class(TMainDataModule)
    TransferenciaDatasource: TDatasource;
    TransferenciaZQuerydata: TDateField;
    TransferenciaZQueryid_conta_credito: TLargeintField;
    TransferenciaZQueryid_conta_debito: TLargeintField;
    TransferenciaZQueryid_transferencia: TLargeintField;
    TransferenciaZQuerynota: TStringField;
    TransferenciaZQueryvalor: TFloatField;
    TransferenciaZSequence: TZSequence;
    TransferenciaZUpdate: TZUpdateSQL;
    TransferenciaZQuery: TZQuery;
    AuxiliarZQuery: TZQuery;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    function BuscaData(): string;
    function AtualizaSaldoCaixa(ContaOrigem: string; ContaO: string;
      ContaD: string; ContaDestino: string; Valor: real; Data: string):boolean;
    procedure AtualizaSaldoO(ContaOrigem: string; ContaDestino: string; ContaD:string;
      Valor: real; Data: string);
    procedure AtualizaSaldoD(ContaOrigem: string; ContaDestino: string; ContaO:string;
      Valor: real; Data: string);
    procedure AtualizaSaldoOCaixa(ContaOrigem: string; ContaO: string;
      ContaD: string; ContaDestino: string; Valor: real; Data: string; IDCaixa:string);
    procedure AtualizaSaldoDCaixa(ContaOrigem: string; ContaO: string;
      ContaD: string; ContaDestino: string; Valor: real; Data: string; IDCaixa:string);
    function BuscaIDCaixa(): string;
  end;

var
  TransferenciaData: TTransferenciaData;

implementation

uses ConnectionDM, MainFm;

{ TTransferenciaData }


procedure TTransferenciaData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := TransferenciaZQuery;
end;


procedure TTransferenciaData.OpenDataSet;
begin
  ConnectionData.EmptyQuery(TransferenciaZQuery, 'transferencia');
end;

procedure TTransferenciaData.CloseDataSet;
begin
  TransferenciaZQuery.Close();
end;

procedure TTransferenciaData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(TransferenciaZQuery, Tabela, Condicoes);
end;

//Busca a Data
function TTransferenciaData.BuscaData(): string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Edit();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

//Atualiza o Sado nas contas ou Caixa
function TTransferenciaData.AtualizaSaldoCaixa(ContaOrigem: string;
  ContaO: string; ContaD: string; ContaDestino: string; Valor: real;
  Data: string): boolean;
var
  IDCaixa: string;
begin
  IDCaixa := BuscaIDCaixa();
  //Se o caixa  não está fechado
  if IDCaixa <> '' then begin
    //Se a conta de Origem for igual a Caixa
    //Conta de Origem Saida de Dinheiro
    if ContaO = 'Caixa' then begin
      AtualizaSaldoOCaixa(ContaOrigem,ContaO,ContaD,ContaDestino,Valor,Data, IDCaixa);
    end else begin
      AtualizaSaldoO(ContaOrigem,ContaDestino,ContaD,Valor,Data);
    end;
    //Conta de Destino  Entrada de Dinheiro
    if ContaD = 'Caixa' then begin
      AtualizaSaldoDCaixa(ContaOrigem,ContaO,ContaD,ContaDestino,Valor,Data, IDCaixa);
    end else begin
      AtualizaSaldoD(ContaOrigem,ContaDestino,ContaO,Valor,Data);
    end;
    Result := True;
  end else begin
    Result := False;
  end;
end;

procedure TTransferenciaData.AtualizaSaldoD(ContaOrigem: string;
  ContaDestino: string; ContaO: string; Valor: real; Data: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE conta');
    SQL.Add('SET valor=valor+:valor');
    SQL.Add('WHERE id_conta=:id_conta');
    ParamByName('id_conta').AsString := ContaDestino;
    ParamByName('valor').AsFloat := Valor;
    ExecSQL();
  end;
  //Insere uma transacao realizada na Conta
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO conta_transacao');
    SQL.Add('VALUES(:conta,:desc,:data,:valor,:tipo,:usuario');
    ParamByName('id_conta').AsString := ContaDestino;
    ParamByName('desc').AsString := 'Transferencia recebida da conta ' + ContaO;
    ParamByName('tipo').AsString := 'C';
    ParamByName('data').AsString := Data;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;
end;

procedure TTransferenciaData.AtualizaSaldoO(ContaOrigem: string;
  ContaDestino: string; ContaD: string; Valor: real; Data: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('UPDATE conta');
    SQL.Add('SET valor=valor-:valor');
    SQL.Add('WHERE id_conta=:id_conta');
    ParamByName('id_conta').AsString := ContaOrigem;
    ParamByName('valor').AsFloat := Valor;
    ExecSQL();
  end;
  //Insere uma transacao realizada na Conta
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO conta_transacao');
    SQL.Add('VALUES(:conta,:desc,:data,:valor,:tipo,:usuario');
    ParamByName('id_conta').AsString := ContaOrigem;
    ParamByName('desc').AsString := 'Transferencia para conta ' + ContaD;
    ParamByName('tipo').AsString := 'D';
    ParamByName('data').AsString := Data;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;
end;

procedure TTransferenciaData.AtualizaSaldoOCaixa(ContaOrigem: string;
  ContaO: string; ContaD: string; ContaDestino: string; Valor: real;
  Data: string; IDCaixa: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO entrada_saida_caixa');
    SQL.Add('VALUES(:id_caixa,:desc,:valor,:s,:id_usuario)');
    ParamByName('id_caixa').AsString := IDCaixa;
    ParamByName('desc').AsString := 'Transferencia para ' + ContaD;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('s').AsString := 'S';
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;
  //Insere uma transacao realizada na Conta
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO conta_transacao');
    SQL.Add('VALUES(:conta,:desc,:data,:valor,:tipo,:usuario');
    ParamByName('id_conta').AsString := ContaOrigem;
    ParamByName('desc').AsString := 'Transferencia para conta ' + ContaD;
    ParamByName('tipo').AsString := 'D';
    ParamByName('data').AsString := Data;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;

end;

procedure TTransferenciaData.AtualizaSaldoDCaixa(ContaOrigem: string;
  ContaO: string; ContaD: string; ContaDestino: string; Valor: real;
  Data: string; IDCaixa: string);
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO entrada_saida_caixa');
    SQL.Add('VALUES(:id_caixa,:desc,:valor,:s,:id_usuario)');
    ParamByName('id_caixa').AsString := IDCaixa;
    ParamByName('desc').AsString := 'Transferencia recebida de ' + ContaO;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('s').AsString := 'E';
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;
  //Insere uma transacao realizada na Conta
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('INSERT INTO conta_transacao');
    SQL.Add('VALUES(:conta,:desc,:data,:valor,:tipo,:usuario');
    ParamByName('id_conta').AsString := ContaDestino;
    ParamByName('desc').AsString := 'Transferencia recebida de ' + ContaO;
    ParamByName('tipo').AsString := 'C';
    ParamByName('data').AsString := Data;
    ParamByName('valor').AsFloat := Valor;
    ParamByName('id_usuario').AsInteger := MainForm.Usuario;
    ExecSQL();
  end;
end;

function TTransferenciaData.BuscaIDCaixa: string;
var
  IDCaixa: string;
begin
  //Busca o ID do Caixa
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select id_caixa from caixa where data_fim =:date');
    ParamByName('date').AsString := '2000-01-01';
    Open();
    if RecordCount > 0 then begin
      IDCaixa := FieldByName('id_caixa').AsString;
    end else begin
      IDCaixa := '';
    end;
  end;
end;

initialization
  {$I transferenciadm.lrs}

end.





